package com.yiwyn.Behavioral.observer;


import lombok.AllArgsConstructor;
import lombok.Data;
import lombok.EqualsAndHashCode;

import java.util.ArrayList;
import java.util.List;

/**
 * 观察者模式demo
 */
public class ObserverDemo {


    public static void main(String[] args) {
        // 添加观察者信息
        GitlabSubject gitlabSubject = new GitlabSubject();
        gitlabSubject.registerObserver(new GitlabUser("tomCat"));
        gitlabSubject.registerObserver(new GitlabUser("watchDog"));

        // 更新操作
        gitlabSubject.notifyObservers("更新");


    }

    // 主题
    interface Subject {
        // 注册观察者
        void registerObserver(Observer observer);

        // 移除观察者
        void removeObserver(Observer observer);

        // 通知观察者
        void notifyObservers(String opt);
    }


    @Data
    static class GitlabSubject implements Subject {

        // 所有订阅的观察者
        private List<Observer> observers = new ArrayList<>();

        @Override
        public void registerObserver(Observer observer) {
            observers.add(observer);
        }

        // 移除观察者
        @Override
        public void removeObserver(Observer observer) {
            observers.remove(observer);
        }

        // 通知到观察者
        @Override
        public void notifyObservers(String opt) {
            for (Observer observer : observers) {
                observer.action(opt);
            }
        }
    }

    // 抽象观察者
    abstract static class Observer {
        // 行为
        public abstract void action(String opt);
    }


    // gitlab用户
    @Data
    @EqualsAndHashCode(callSuper = true)
    @AllArgsConstructor
    static class GitlabUser extends Observer {

        private String username;

        @Override
        public void action(String opt) {
            System.out.println(username + "收到了gitlab仓库进行了操作：" + opt);
        }
    }


}
